//package com.ruoyi.framework.aspect;
//
//
//import com.ruoyi.common.constant.DataSourceNames;
//import com.ruoyi.framework.datasources.DynamicDataSource;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.After;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.annotation.Order;
//
//import java.lang.reflect.Method;
//
///**
// * 多数据源，切面处理类
// *
// */
//@Aspect
//@Configuration
//@Order(0)
//public class DataSourceAspect {
//    protected Logger logger = LoggerFactory.getLogger(getClass());
//
//    @Pointcut("execution(* com.ruoyi.*.service.impl.*.*(..)) || execution(* com.ruoyi.*.service.*.*(..))")
//    public void dataSourcePointCut() {
//
//    }
//
//    @Around("dataSourcePointCut()")
//    public Object around(ProceedingJoinPoint point) throws Throwable {
//        DataSource ds;
//        Class<?> target = point.getTarget().getClass();
//        MethodSignature signature = (MethodSignature) point.getSignature();
//        Method method = signature.getMethod();
//        ds = resolveDataSource(target, method);
//
//        if (ds == null) {
//            DynamicDataSource.setDataSource(DataSourceNames.MASTER);
//            logger.info("设置默认数据源:" + DataSourceNames.MASTER);
//        } else {
//            DynamicDataSource.setDataSource(ds.name());
//            logger.info("设置已经标了注解的数据源" + ds.name());
//        }
//        return point.proceed();
//    }
//
//    /**
//     * 销毁数据源
//     */
//    @After("dataSourcePointCut()")
//    public void restoreDataSource() {
//        DynamicDataSource.clearDataSource();
//    }
//
//    /*
//     * 获取最终的dataSource
//     *
//     * @param clazz
//     * @param method
//     */
//    private DataSource resolveDataSource(Class<?> clazz, Method method) {
//        try {
//            DataSource ds = null;
//            Class<?>[] types = method.getParameterTypes();
//            // 默认使用类型注解
//            if (clazz.isAnnotationPresent(DataSource.class)) {
//                ds = clazz.getAnnotation(DataSource.class);
//            }
//            // 方法注解可以覆盖类型注解
//            Method m = clazz.getMethod(method.getName(), types);
//            if (m.isAnnotationPresent(DataSource.class)) {
//                ds = m.getAnnotation(DataSource.class);
//            }
//            return ds;
//        } catch (Exception e) {
//            System.out.println(clazz + ":" + e.getMessage());
//        }
//        return null;
//    }
//}
